<?php


namespace app\test\controller;


use app\model\User;
use think\Controller;
use think\Db;

class DataTest extends Controller
{
    public function index()
    {
        /*只查询一条语句，find()*/
//       $data =  Db::table('tp_user')->find();
//     显示具体语句 得到最近一条sql查询的原生语句

        /*链式查询*/
//       $data =  Db::table('tp_user')->where('id','27')->find();
//        $data =  Db::table('tp_user')->where('id','127')->find(); //查询不到显示null
//        没有数据时抛出异常
//        try {
//            $data =  Db::table('tp_user')->where('id','27')->findOrFail();
//        }catch (DataNotFoundException $e){
//            return '查询不到数据！';
//        }

//        使用findOrEmpty()方法查询一条数据，但在没有数据时返回一个空数组
//        $data =  Db::table('tp_user')->where('id','127')->findOrEmpty();

        //多列数据
//        $data =  Db::table('tp_user')->select();
//在多列查询时查询不到数据时抛出异常
//        $data =  Db::table('tp_user')->where('id','27')->selectOrFail();

        //当在数据库配置了前缀时，使用name
//        $data = Db::name('user')->select();

        //助手函数 \db可以更方便查询，去掉\也行
        $data = db('user')->select();

//        通过value()方法，可以 查询指定字段的值(单个)，没有数据返回null
//        $data = \db('user')->where('id',27)->value('username');

//        通过colunm()方法，可以查询指定裂的值(多个)，没有数据返回空数组
//        $data = \db('user')->column('username');

//        可以指定id作为列值的索引：
//        $data=\db('user')->column('username','id');

        /*
         * 1. 前面的我们通过指向符号->多次连续调用方法称为：链式查询
         * 2. 当Db:name('user')时，返回数据库对象，即可连缀数据库对应的方法
         * 3. 而每次执行一个数据库查询方法时，比如where()，还将返回数据库对象
         * 4. 只要还是数据库对象，那么就可以一直使用指向符号进行链式查询
         * 5. 如果想要最后得到结果，可以使用find()\select()等方法结束查询
         * 6. 而find()和select()是结果查询方法（放在最后），并不是链式查询方法
         * */
//        print_r(Db::name('user')->where('id',27)->order('id','desc')->find());
//        $data1 = Db::name('user')->where('id',27)->order('id','desc')->find();
//        return Db::getLastSql();
//       $data2 = Db::name('user')->select();
        //连续查询两个user会造成资源浪费

        $user = Db::name('user');
        /*当同一个对象实例第二次查询后，会保留第一次查询的值
        解决方法：增加removeOption()方法
        */
        $data1 = $user->where('id', 27)->order('id', 'desc')->find();
        $data2 = $user->removeOption('where')->removeOption('order')->select();
//        return Db::getLastSql();


        //多次查询


        return Db::getLastSql();
//       return json($data2);
    }

//不使用模型
    public function getNoModelData()
    {
//        table加前缀
//       $data =  Db::table('tp_user')->select();
        $data = Db::name('user')->select();
        return json($data);
    }

//使用模型
    public function getModelData()
    {
        $data = User::select();
        return json($data);
    }

    public function insert()
    {
        $data = [
            'username' => '小钟',
            'password' => '123',
            'gender' => '男',
            'email' => 'xiaozhong@163@.com',
            'price' => 90,
            'details' => '123',
            //如果字段不存在，会抛出一个异常
//            'nowdata' =>'nodata',
            'create_time' => date('Y-m-d H:i:s')
        ];
//        如果新增成功，insect()方法会返回一个1值
//       $insert =  Db::name('user')->insert($data);

//使用data()方法来设置添加的数据数组
        $insert = Db::name('user')->data($data)->insert();
//        return Db::getLastSql();
        //在新增成功后返回当前数据的ID
        return Db::getLastInsID();
        return $insert;

    }

    //批量更新数据
    public function insertAll()
    {
        $dataAll = [
            [
                'username' => '啊炎',
                'password' => '123',
                'gender' => '男',
                'email' => 'ayan@163@.com',
                'price' => 90,
                'details' => '123',
                'create_time' => date('Y-m-d H:i:s')
            ],
            [
                'username' => '啊选',
                'password' => '123',
                'gender' => '男',
                'email' => 'axuan@163@.com',
                'price' => 90,
                'details' => '123',
                'create_time' => date('Y-m-d H:i:s')
            ]
        ];
        Db::name('user')->insertAll($dataAll);
        return $dataAll;
    }

    public function update(){
        $data = [
          'username' =>'靓仔',
            'id'    =>'240',
            'email' =>Db::raw('UPPER(email)'),
            'price' =>Db::raw('price - 3')
        ];
//      $updata = Db::name('user')->where('id',235)->update($data);
//        使用update()方法来修改数据，修改成功返回1，没有修改返回0

        //使用inc()方法进行增值  减值方法dec
//        $updata = Db::name('user')->inc('price','3')->update($data);

        //插入sql语句 例如让email大写
//        $updata = Db::name('user')->exp('email','UPPER(email)')->update($data);
        Db::name('user')->update($data);
        //进阶写法 raw()

        //如果修改的数组包含主键，也可以直接修改

        //只改一个值
        Db::name('user')->where('id',238)->setField('username','帅哥');

//      return $updata;
    }
    public function delete(){
        //根据主键
//        Db::name('user')->delete(237);
    //删除某一段数据
//        Db::name('user')->delete([236,238,233]);

        //正常情况下，利用where来删除
        \db('user')->where('id',239)->delete();

//        通过true参数删除数据表所有数据 delete(true)
    }
}